package com.example.cliente;


	import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

import libreria.ItemHistorico;
import libreria.item;
import libreria.paquete;

import android.util.Log;
import java.util.Date;

import android.os.AsyncTask;
import android.widget.Toast;

public class sock_cliente extends AsyncTask<Void, Integer, Void> {

	public static paquete paquete_recibido;
	@Override
	protected Void doInBackground(Void... params) {
		cliente.misocket = null;
		cliente.out = null;
		cliente.in = null;

		try {
//			android.os.Debug.waitForDebugger();

			Log.e("sock", "dentro arranco el thread ");
			// MainActivity.misocket = new  Socket("192.168.1.130", 4444);
			// MainActivity.misocket = new Socket("192.168.1.10", 4444);
			cliente.misocket = new Socket(cliente.dir_espejo, 4444);
			Log.e("sock", "conectado");
//			Toast toast = Toast.makeText(cliente.ctx, "conectado a espejo",
//					Toast.LENGTH_LONG);
//			toast.show();

			OutputStream os = cliente.misocket.getOutputStream();
			cliente.out = new ObjectOutputStream(os);

			InputStream buffer = new BufferedInputStream(
					cliente.misocket.getInputStream());
			cliente.in = new ObjectInputStream(buffer);
			String nomf =String.format("%-50s", cliente.nombre_servidor); 
			String passf =String.format("%-10s", cliente.pass_servidor);
			paquete_recibido = new paquete(false, 11, "cliente", 0.0, 0, 0L, null,nomf+passf);

			cliente.out.writeObject(paquete_recibido);
			cliente.out.flush();
		//	publishProgress(11);
			while (true) {
				paquete_recibido = (paquete) cliente.in.readObject();
				procesar (paquete_recibido);

			}
		} catch (IOException e) {
			System.err.println("no conecta :" + e.getMessage());
//			System.exit(1);
			publishProgress(paquete_recibido.tipo);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

	protected void onProgressUpdate(Integer... progress) {
		int tipo = progress[0];
		Toast toast;
		switch (tipo) {
		case 1:
//			cliente.mSectionsPagerAdapter.notifyDataSetChanged();
			break;
		case 11:
			toast = Toast.makeText(cliente.ctx, "solicitando conexion",
					Toast.LENGTH_LONG);
			toast.show();
			break;
		case 12:
			toast = Toast.makeText(cliente.ctx, "conectado",
					Toast.LENGTH_LONG);
			toast.show();
			break;
		case 13:
			toast = Toast.makeText(cliente.ctx, "conexion imposible",
					Toast.LENGTH_LONG);
			toast.show();
			break;
// el servidor ha terminado de entreger todos los datos : xml, valor de variables y historiales		
		case 9:
//			cliente.mSectionsPagerAdapter.notifyDataSetChanged();
//			cliente.mViewPager.invalidate();
			pintor_cliente mipintor= (pintor_cliente) new pintor_cliente().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
			break;

		default:
			break;
		}
		
	}
	
	
	
	void procesar (paquete paq) {

		item mitem;
		switch (paq.tipo) {
// La conexion con espejo esta hecha y solicito al servidor los datos
		case 12:
			publishProgress(paquete_recibido.tipo);
			paquete mipaquete = new paquete(false, 1,cliente.nombre_servidor, 0.0, 0, 0L, null,null);
			try {
				cliente.out.writeObject(mipaquete);
				cliente.out.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}		
			break;
// el swervidor responde con el XML y creo el xml
		case 1:
			xml_cliente.crearDocumento(paquete_recibido.xmlEstructura);
			xml_cliente.parsearDocumento();
			publishProgress(paquete_recibido.tipo);		
			break;
// llega el valor de una variable			
		case 2:		
			mitem =servidor_cliente.buscar_variable(paquete_recibido.nombre);
			mitem.valor=paquete_recibido.valor;
			mitem.calidad=paquete_recibido.calidad;
			mitem.tiempo=new Date (paquete_recibido.tiempo);
			mitem.hayquepintar=true;
			if (mitem.historial != null) {
				ItemHistorico mi = new ItemHistorico(
						mitem.valor, mitem.tiempo);
				mitem.historial.meter(mi);
			}
			break;
// llega un historial
		case 3:
			mitem =servidor_cliente.buscar_variable(paquete_recibido.nombre);
			mitem.historial=paquete_recibido.historial;
			break;
			
		case 11:
			publishProgress(paquete_recibido.tipo);
			break;
		case 13:
			publishProgress(paquete_recibido.tipo);
			break;
		case 9:
			publishProgress(paquete_recibido.tipo);
			break;

		default:
			break;
		}
	}
}